//重要提示: 如果在启动前端项目时, 提示找不到axios, 把光标放在 import axios from "axios"的'axios', 会有一个修复提示, 导入axios, 导入即可正常使用.
import axios from 'axios'
import { ElMessage } from 'element-plus'
import router from '@/router'

const axios_ = axios.create({
    timeout: 500000
})

//添加请求拦截器
axios_.interceptors.request.use(config => {
    // 获取token
    const token = localStorage.getItem('token')
    // 处理JSON请求
    config.headers['Content-Type'] = 'application/json;charset=utf-8'

    // 添加token到请求头
    if (token) {
        // token已包含Bearer前缀，直接使用
        config.headers['Authorization'] = token
    }

    return config
}, error => {
    // 请求错误处理
    return Promise.reject(error)
})

//添加响应拦截器
axios_.interceptors.response.use(response => {
    let res = response.data;
    //如果返回的是文件
    if (response.config.responseType === 'blob') {
        return res;
    }
    //如果是string类型, 就转为json
    if (typeof res === 'string') {
        res = res ? JSON.parse(res) : res;
    }
    // 处理错误状态码
    if (res.code !== 200) {

        // 处理401未认证
        if (res.code === 401) {
            // 清除token
            localStorage.removeItem('token');
            // 跳转到登录页
            router.push('/login')
        }

        //处理500错误
        if (res.code === 500) {
            // 显示错误信息
            ElMessage.error('服务器端报500');
        }

        return Promise.reject(res);
    }

    return res;
}, error => {
    // 处理超时错误
    if (error.message && error.message.includes('timeout')) {
        ElMessage.error('请求超时');
        // 捕获错误后不再释放，返回空对象 这种处理方式适合那些希望在UI层面统一处理错误，而不希望在每个业务代码中都写错误处理逻辑的场景。
        return Promise.resolve({data: null});
    }

    // 处理网络错误
    ElMessage.error('网络错误，请稍后重试');
    // 捕获错误后不再释放，返回空对象
    return Promise.reject(error);
})

export default axios_
